<?php
class AcessoDAO extends GenericDAO  {

	function __construct() {
		$this->tabela["alteracao"] = array(	"id" 	=> 11, 
											"nome" 	=> strtolower(substr(get_class(), 0, -3)));
		
		$this->tabela["consulta"]  = array(	"id" 	=> 15,
											"nome" 	=> "vw_" . strtolower(substr(get_class(), 0, -3)));
	}
	
	public function consultarPK($valor) {
	    $sql = "where grupoid = :grupo and recursoid = :recurso";
	    $params['grupo'] = $valor['grupo'];
	    $params['recurso'] = $valor['recurso'];
	    return $this->addRecursoSelfPerm($this->consultar($sql, $params), "recursoid");
	}

	public function consultarGrupo($valor) {
	    $sql = "where grupoid = :grupo";
	    $params['grupo'] = $valor;
	    return $this->addRecursoSelfPerm($this->consultar($sql, $params), "recursoid");
	}
		
	public function consultarUsuario($usuarioid) {
	    $where = "where grupoid in (select grupo from usu_x_grupo where usuario = :usuario)";
	    $params['usuario'] = $usuarioid;
		return $this->addRecursoSelfPerm($this->consultar($where, $params), "recursoid");
	}
	
	public function consultarFilhos($grupo, $id) {
		$sql = "where grupoid = :grupo ";
		$params['grupo'] = $grupo;
		
		if (is_null($id)) {
			$sql .= "and pai is null";
		} else {
			$sql .= "and pai = :pai";
			$params['pai'] = $id;
		}
	    return $this->addRecursoSelfPerm($this->consultar($sql, $params), "recursoid");
	}
		
	public function consultarArvore($grupo, $recurso = null) {
		$head = $this->consultarFilhos($grupo, $recurso);
		foreach ($head as $id => $filho) {
			$head[$id]["recursos"] = $this->consultarArvore($grupo, $filho["recursoid"]);
		}
		return $this->addRecursoSelfPerm($head, "recursoid");
	}
	
	public function consultarGruposComAcesso($recurso) {
		$sql = "where recursoid = :recurso and acesso = 1";
		$params['recurso'] = $recurso;
		return $this->consultar($sql, $params);
	}
	
	public function inserir($registro, $finalizarTransacao = true) {					 
		return $this->execSQL("insert into acesso (recurso, grupo) 					 " . 
							 "            select r.id, g.id 						 " . 
							 "              from recurso r, 						 " .
							 "                   grupousuarios g 					 " .
							 "             where not exists (select * 				 " .
							 "								   from acesso a 		 " .
							 "								  where a.recurso = r.id " .
							 "								    and a.grupo = g.id)	 " ,
							null, 
							$finalizarTransacao);
	}
	
	public function excluir($id, $finalizarTransacao = true) {
		$pk['grupo'] = $id['grupo'];
		$pk['recurso'] = $id['recurso'];
		$reg['acesso'] = 0;
		return $this->alterarRegistro($reg, $pk, $finalizarTransacao);
	}
	
	public function excluirGrupo($grupo, $finalizarTransacao = true) {
		$sql = "delete from " . $this->tabela["alteracao"]["nome"] . " where grupo = :grupo";
		$params['grupo'] = $grupo;
		return $this->ExecSQL($sql, $params, $finalizarTransacao);
	}
	
	public function excluirRecurso($recurso, $finalizarTransacao = true) {
		$sql = "delete from " . $this->tabela["alteracao"]["nome"] . " where recurso = :recurso";
		$params['recurso'] = $recurso;
		return $this->ExecSQL($sql, $params, $finalizarTransacao);
	}
	
	public function revogarPermissoes($grupo, $finalizarTransacao = true) {
		$sql = "update " . $this->tabela["alteracao"]["nome"] . " set acesso = 0 where grupo = :grupo";
		$params['grupo'] = $grupo;
		$res = $this->execSQL($sql, $params, $finalizarTransacao);
	}
	
	public function alterar($registro, $finalizarTransacao = true) {
		$res = null;

		if ($registro["acesso"] == 1) {
			if (!$this->consultarPermissao($_SESSION['usuario']['id'], $registro['recurso'])) {
				throw new Exception("Tentativa de conceder permissão que não possui (" . $registro['recurso'] . ").");
			}
		}
		$campo_dep = array(false => "ido", 
							true => "ente");
		$dao = new Rec_erDAO();
		$pk['grupo']   = $registro['grupo'];
		$pk['recurso'] = $registro['recurso'];
		$reg['acesso'] = $registro['acesso'];
		$res = $this->alterarRegistro($reg, $pk, false);
		
		$deps[$campo_dep[($reg['acesso'] == 1)]] = $registro['recurso'];
		foreach($dao->consultarPK($deps) as $dep) {
			$registro['recurso'] = $dep[$campo_dep[!($reg['acesso'] == 1)]];
			$res = $this->alterar($registro, false);
		}
		if ($finalizarTransacao) {
			$this->commit();
		}
		return $res;
	}
	
	public function atualizarRecurso($recurso, $grupos, $finalizarTransacao = true) {
		if (!$this->consultarPermissao($_SESSION['usuario']['id'], $recurso)) {
			throw new Exception("Tentativa de conceder permissão que não possui ($recurso).");
		}
		
		$sql = "update " . $this->tabela["alteracao"]["nome"] . " set acesso = 0 where recurso = :recurso";
		$params['recurso'] = $recurso;
		$res = $this->execSQL($sql, $params, false);
		foreach($grupos as $grupo) {
			$registro['grupo'] = $grupo;
			$registro['recurso'] = $recurso;
			$registro['acesso'] = 1;
			$res = $this->alterar($registro, false);
		}
		$this->commit();
		return (!is_null($res));
	}
}
?>